/*  2023/03/20 by DPH
*   进行网络地址分配
*
*
*
*/

#ifndef SERVE_HEADER_H
#define SERVE_HEADER_H

#include "ns3/header.h"
#include "ns3/address-utils.h"

namespace ns3{


class ServeHeader : public Header
{
public:
    static TypeId GetTypeId(void);

    ServeHeader();
    ~ServeHeader();

    // 节点状态类型
    enum NodeState
    {
        CENTRAL_NODE = 0,           // 中心节点
        RELAY_NODE = 1,             // 中继节点
        RELAY_SUB_NODE = 2,         // 中继子节点
        ISOLATED_NODE = 3           // 孤立节点
    };

    // 节点状态类型
    enum ServeType
    {
        REQUCENTER = 1,             // 自举中心
        ACCESSAPPLY = 2,            // 入网申请
        ACCESSACK = 3,              // 入网应答
        MULTLINKDISC = 4,           // 多跳链路发现
        MULTLINKACK = 5,            // 多跳链路确认
    };

    void SetType (uint8_t type);
    void SetIdHigh (uint8_t id);
    void SetIdLow (uint8_t id);

    uint8_t GetType(void) const;
    uint8_t GetSourIdHigh(void) const;
    uint8_t GetSourIdLow(void) const;
    
private:
    virtual TypeId GetInstanceTypeId (void) const;
    virtual void Print (std::ostream &os) const;
    virtual uint32_t GetSerializedSize (void) const;
    virtual void Serialize (Buffer::Iterator start) const;
    virtual uint32_t Deserialize (Buffer::Iterator start);


    Ipv4Address m_sourAddr;         // 发端网络序号
    Ipv4Address m_destAddr;         // 收端网络序号
    uint8_t m_nodeState;          // 发端身份状态 可以是枚举类型
    uint8_t m_serveType;          // 勤务类型          
    uint8_t m_sourIdHigh;           // 发端ID高
    uint8_t m_sourIdLow;            // 发端ID低
    uint8_t m_message0;             // 消息体0
    uint8_t m_message1;             // 消息体1
    uint8_t m_message2;             // 消息体2
    uint8_t m_message3;             // 消息体3
    uint8_t m_message4;             // 消息体4
    uint8_t m_message5;             // 消息体5
    uint8_t m_message6;             // 消息体6
    uint8_t m_message7;             // 消息体7
    uint8_t m_message8;             // 消息体8
    uint8_t m_message9;             // 消息体9
    uint8_t m_reserve;              // 保留
    uint16_t m_check;               // 校验和
    

};
}

#endif
